// h.js
import vnode from './vnode.js'
// 编写一个简单的h函数，只能接受3个参数
export default function h(sel, data, c) {
    // 检查参数的个数
    if (arguments.length !== 3) {
        throw new Error('这个手写的简单h函数只能穿入三参数！')
    }
    // 检查c的类型
    if (typeof c == 'string' || typeof c == 'number') {
        // 说明现在调用h函数是这样的 h('div', {}, '文字')
        return vnode(sel, data, undefined, c, undefined)
    } else if (Array.isArray(c)) {
        // 说明现在调用h函数是这样的 h('div', {}, [])
        let children = []
        // 遍历c
        for (let i = 0; i < c.length; i++) {
            // 检查c[i]必须是一个对象, 如果不满足
            if (!(typeof c[i] === 'object' && c[i].hasOwnProperty('sel'))) {
                throw new Error('传入的数组参数中，有项的结果不是h函数')
            }
            // 这里不用执行c[i] 因为测试语句中已经有了执行
            // 只需要收集好就行
            children.push(c[i])
        }
        // 循环结束了，就说明children收集完毕了，此时可以返回虚拟节点了，他有children属性的
        return vnode(sel, data, children, undefined, undefined)
    } else if (typeof c === 'object' && c.hasOwnProperty('sel')) {
        // 说明现在调用h函数是这样的 h('div', {}, h())
        // 即，传入的c是唯一的children, 不用执行c，测试语句中已经执行cl 
        let children = [c]
        return vnode(sel, data, children, undefined, undefined)
    } else {
        throw new Error('传入的第三个参数类型不正确')
    }
}